package ConcurrentProgramming;

import java.util.concurrent.TimeUnit;

/**
 * 后台线程
 *  所谓的后台线程就是指：程序运行期间在后台提供一种通用服务的线程，并且这种线程并不属于程序中不可或缺的一部分
 *  因此，当所有非后台线程结束时，也就随之结束了，换句话，只要有任何非后台线程执行，守护线程就不会死亡。main方法
 *  就是一个常见的非后台线程，也成为主线程，程序执行的入口
 *
 * ThreadFactory 和 DaemonThreadFactory 两个都是线程工厂
 *
 */
class SimpleDaemon implements Runnable {
    @Override
    public void run() {
        try {
            while (true) {
                TimeUnit.MILLISECONDS.sleep(100); // 每隔100ms进行打印
                System.out.println(Thread.currentThread()+" "+this);
            }
        } catch (InterruptedException e) {
            System.out.println("sleep() interrupted");
        }
    }
}

public class Daemon {
    /**
     * 下面设置的睡眠时间大于守护线程，所以守护线程会执行
     * 如果设置的睡眠时间小于，只会执行非后台线程main，执行完毕之后main结束了，则守护线程也就结束了
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread daemon = new Thread(new SimpleDaemon());
            daemon.setDaemon(true);
            daemon.start();
        }
        System.out.println("All daemons started"); // 主线程main执行的
        TimeUnit.MILLISECONDS.sleep(175);
    }
}
